package com.tedu.api.ee;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合一场---标准IO
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable  顶级异常超类
 *
 * Exception异常：描述程序级别错误---有解决方案
 *               编译期：--RuntimeException异常表示类--
 *                      FileOutputStream创建对象---波浪线---抛出方法之外
 *               检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *               解决方案：①捕获异常(*)
 *                       ②抛出异常---抛出方法之外--打印控制台
 *
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台输出异常对象名称，RunTimeException异常表示
 *               最后了解 【throw与throws---RunTimeException】
 * Error错误：描述系统级别错误---出现--程序宕机
 *           非常低--->递归问题--->
 *
 */
public class EE {
    /**
     * Error  错误---程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ----程序宕机---后台：9亿账号
     * while(ture){
     *     拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }
    /*Exception异常：检查异常【出现编译期】---代码报波浪线
              两种手段：①捕获异常：记录错误
                      语法：try{
                          怀疑代码可能有异常或者提示异常
                                     }catch(小异常名字 e){
                          e.printStacktrace(); 打印异常信息
                                      }catch(中异常名字 e){
                          e.printStacktrace(); 打印异常信息
                                      }catch(大异常名字 e){      Exception *                          e.printStacktrace(); 打印异常信息
                                  }finally{
                          一定执行代码块
                                      }
                     快捷键：ctrl+alt+T

                               ②抛出异常 throw  异常名字【并未解决】
                           考试题：throw与throws的区别
               异常关键字：throw
                                    throws

                          非检查异常【出现运行期】---代码无错误---控制台
---------------------------------------------------------------------------
         异常：FileNotFoundException   文件不存在异常
 产生原因：路径写错、文件名写错
 异常：NullPointerException    空指针异常
 产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
            * 异常：StringIndexOutOfBoundsException  字符串下标越界异常
 产生原因：字符串下标没有对应的字符
 异常：NumberFormatException   数字转换异常
 产生原因：字符串不是正确的类型*/

    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线
        FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台
        try {
            String str="a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str); //解析字符串--转换为对应类型
        } catch(StringIndexOutOfBoundsException e){
            e.printStackTrace(); //打印异常信息
            System.out.println("字符串小异常：下标越界异常~~");
        } catch (NumberFormatException e) {
            e.printStackTrace();   //打印异常信息
            System.out.println("字符串小异常~~");
        } catch (Exception e){
            e.printStackTrace();
            System.out.println("大异常~~");
        }
        finally {
            System.out.println("一定执行代码块");
        }
    }


    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API----java.lang.异常
     *      字符串、包装类、集合、IO流
     */
    @Test
    public void testHomeWork1(){
        //异常一
        //FileNotFoundException异常
        //FileInputStream b=new FileInputStream("12");
        //异常二
        //throw new RuntimeException();
        //异常三
        //throw new FileNotFoundException();
        //异常四 IOException
        //Object obj="string";
        //Integer num=(Integer) obj;
        //异常五 ArrayIndexOutOfBoundsException
        //int[] arr=new int[6];
        //System.out.println(arr[9]);

    }
}
